import random
import pygame
# 屏幕大小常量
SCREEN_RECT=pygame.Rect(0,0,1000,1400)
# 刷新的帧率
FRAME_PER_SEC=60
# 创建敌机的d定时器常量
CREAT_ENEMY_EVENT=pygame.USEREVENT
# 英雄发射子弹事件
HERO_FIRE_EVENT=pygame.USEREVENT+1

class GameSprite(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    def __init__(self,image_name,speed=1):
        # 调用父类初始化方法
        super().__init__()

        self.image=pygame.image.load(image_name)
        self.rect=self.image.get_rect()
        self.speed=speed
    def update(self):
#         在屏幕垂直方向运动
        self.rect.y +=self.speed

class Background(GameSprite):
    """游戏背景精灵"""
    def __init__(self,is_alt=False):
        super().__init__("D:\\python\\plane fight\\1.jpg")
        if is_alt:
            self.rect.y=-self.rect.height

    def update(self):
        # 1.调用父类方法实现
        super().update()
        # 2.判断是否移除屏幕
        if self.rect.y>=SCREEN_RECT.height:
            self.rect.y=-self.rect.height

class Enemy(GameSprite):
    """敌机精灵"""
    def __init__(self):
        super().__init__("D:\\python\\plane fight\\3.png")  # 注意: 这里假设父类的初始化方法接受一个图像路径参数，实际情况可能需调整
        # 加载图片
        original_image = pygame.image.load(r"D:\python\plane fight\3.png")  # 使用 raw 字符串避免转义问题
        
        # 设置最大显示宽度和高度，根据需要调整
        max_display_width = 100
        max_display_height = 50
        
        # 获取原始图片尺寸
        orig_width, orig_height = original_image.get_size()
        
        # 计算缩放比例，以适应最大显示尺寸同时保持长宽比
        if orig_width > orig_height:
            scale_factor = max_display_width / orig_width
        else:
            scale_factor = max_display_height / orig_height
        
        # 限制缩放比例不超过1，防止放大图片
        scale_factor = min(1, scale_factor)
        
        # 根据缩放比例调整图片尺寸
        new_width = int(orig_width * scale_factor)
        new_height = int(orig_height * scale_factor)
        self.image = pygame.transform.scale(original_image, (new_width, new_height))
        
        # 更新 Rect 对象
        self.rect = self.image.get_rect()


        
        self.speed=random.randint(1,3)
        self.rect.bottom=0
        max_x=SCREEN_RECT.width-self.rect.width
        self.rect.x=random.randint(0,max_x)

    def update(self):
        super().update()
        if self.rect.y>=SCREEN_RECT.height:
            # kill方法将精灵移除精灵组。
            self.kill()

    def __del__(self):
        # print("敌机挂了%s",self.rect)
        pass

class Hero(GameSprite):
    """英雄精灵"""
    def __init__(self):
        # super().__init__("D:\\python\\plane fight\\2.png",speed=0)

        super().__init__("D:\\python\\plane fight\\2.png")  # 注意: 这里假设父类的初始化方法接受一个图像路径参数，实际情况可能需调整
        # 加载图片
        original_image = pygame.image.load(r"D:\python\plane fight\2.png")  # 使用 raw 字符串避免转义问题
        
        # 设置最大显示宽度和高度，根据需要调整
        max_display_width = 100
        max_display_height = 50
        
        # 获取原始图片尺寸
        orig_width, orig_height = original_image.get_size()
        
        # 计算缩放比例，以适应最大显示尺寸同时保持长宽比
        if orig_width > orig_height:
            scale_factor = max_display_width / orig_width
        else:
            scale_factor = max_display_height / orig_height
        
        # 限制缩放比例不超过1，防止放大图片
        scale_factor = min(1, scale_factor)
        
        # 根据缩放比例调整图片尺寸
        new_width = int(orig_width * scale_factor)
        new_height = int(orig_height * scale_factor)
        self.image = pygame.transform.scale(original_image, (new_width, new_height))
        
        # 更新 Rect 对象
        self.rect = self.image.get_rect()
        self.rect.centerx=SCREEN_RECT.centerx
        self.rect.bottom=SCREEN_RECT.bottom-120

    #     创建子弹精灵组
        self.bulltes=pygame.sprite.Group()


    def update(self):
        # 英雄在水平方向运动
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

        # 控制英雄不离开屏幕
        if self.rect.x<0:
            self.rect.x=0
        elif self.rect.right>SCREEN_RECT.right:
            self.rect.right=SCREEN_RECT.right

    def fire(self):


        for i in (0, 1, 2):
    #         1.创建子弹精灵
            bullet=Bullet()
    #         2.设置精灵位置
            bullet.rect.bottom=self.rect.y - i*20
            bullet.rect.centerx=self.rect.centerx
    #         3.添加到精灵组
            self.bulltes.add(bullet)


class Bullet(GameSprite):
    """子弹精灵"""
    def __init__(self):
        super().__init__("D:\\python\\plane fight\\4.png",speed=-8)

    def update(self):
    #     调用父类方法，子弹垂直飞行
        super().update()
    #     判断子弹飞出屏幕，销毁子弹
        if self.rect.bottom<0:
            self.kill()

